import fs from "fs-extra";
import path from "path";
import config from "./EslintPluginConfig.js";

// 配置文件类型定义
export interface EslintPluginConfig {
  configFiles: {
    eslint: string;
    prettier: string;
    editorconfig: string;
  };
  scripts: {
    "lint:script": string;
    "lint-fix:script": string;
  };
  dependencies: {
    [key: string]: string;
  };
  projectTypes: {
    browser: string;
    node: string;
    uniapp: string;
    browser_amis: string;
  };
}

/**
 * 配置文件模型类，提供对配置文件的增删改查操作
 */
export class EslintPluginConfigModel {
  /**
   * 获取配置文件内容
   * @returns 配置文件内容
   */
  static async getConfig(): Promise<EslintPluginConfig> {
    try {
      return config as EslintPluginConfig;
    } catch (error: any) {
      throw new Error(`读取配置文件失败: ${error.message}`);
    }
  }

  /**
   * 获取配置文件中的特定配置项
   * @param key 配置项键名
   * @returns 配置项值
   */
  static async getConfigItem<K extends keyof EslintPluginConfig>(
    key: K
  ): Promise<EslintPluginConfig[K]> {
    const configData = await this.getConfig();
    return configData[key];
  }

  /**
   * 更新配置文件
   * @param config 新的配置内容
   */
  static async updateConfig(configData: EslintPluginConfig): Promise<void> {
    try {
      // 注意：由于配置现在是JS模块，此方法不再支持直接更新
      // 如需更新配置，请手动修改eslint-plugin-config.mjs文件
      console.warn(
        "配置文件已更改为JS模块，不支持动态更新，请手动修改eslint-plugin-config.mjs文件"
      );
    } catch (error: any) {
      throw new Error(`更新配置文件失败: ${error.message}`);
    }
  }

  /**
   * 更新配置文件中的特定配置项
   * @param key 配置项键名
   * @param value 配置项新值
   */
  static async updateConfigItem<K extends keyof EslintPluginConfig>(
    key: K,
    value: EslintPluginConfig[K]
  ): Promise<void> {
    // 注意：由于配置现在是JS模块，此方法不再支持直接更新
    console.warn(
      "配置文件已更改为JS模块，不支持动态更新，请手动修改eslint-plugin-config.mjs文件"
    );
  }

  /**
   * 获取配置文件内容字符串
   * @param configType 配置文件类型
   * @param projectType 项目类型
   * @returns 配置文件内容字符串
   */
  static async getConfigFileContent(
    configType: "eslint" | "prettier" | "editorconfig",
    projectType?: string
  ): Promise<string> {
    switch (configType) {
      case "eslint":
        return this.getEslintConfigContent(projectType);
      case "prettier":
        return this.getPrettierConfigContent();
      case "editorconfig":
        return this.getEditorConfigContent();
      default:
        throw new Error(`不支持的配置文件类型: ${configType}`);
    }
  }

  /**
   * 获取ESLint配置文件内容
   * @param projectType 项目类型
   * @returns ESLint配置文件内容
   */
  private static async getEslintConfigContent(
    projectType?: string
  ): Promise<string> {
    const configData = await this.getConfig();
    const importContent = `import zmn from '@zmn/eslint-plugin';`;

    // 如果未指定项目类型，默认使用browser
    const targetType = projectType || "browser";
    let exportContent = `export default zmn.configs.browser;`; // 默认值

    // 根据项目类型获取对应的配置
    const projectTypes = configData.projectTypes;
    if (targetType === "browser") {
      exportContent = `export default zmn.configs.${projectTypes.browser};`;
    } else if (targetType === "node") {
      exportContent = `export default zmn.configs.${projectTypes.node};`;
    } else if (targetType === "uniapp") {
      exportContent = `export default zmn.configs.${projectTypes.uniapp};`;
    } else if (targetType === "browser_amis") {
      exportContent = `export default zmn.configs['${projectTypes.browser_amis}'];`;
    }

    return `${importContent}\n${exportContent}`;
  }

  /**
   * 获取Prettier配置文件内容
   * @returns Prettier配置文件内容
   */
  private static getPrettierConfigContent(): string {
    return `"@zmn/prettier-config"`;
  }

  /**
   * 获取EditorConfig配置文件内容
   * @returns EditorConfig配置文件内容
   */
  private static getEditorConfigContent(): string {
    return `
root = true

[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
indent_size = 2
  `;
  }
}
